﻿#pragma once

#ifndef CARDS_H
#define CARDS_H
#include <QSet>

#include "card.h"

// Cards集合类
// 只有一个成员变量 QSet<Card> m_cards 牌的集合
class Cards {
public:
	enum SortType { Asc, Desc, NoSort };  // 枚举 排序方式
	Cards();                              // 默认构造，基本无用，但是要有
	explicit Cards(const Card& card);     // 有参构造，调用add函数将一张卡牌加入集合中

	/*参数同一使用常引用，避免拷贝*/
	// 添加扑克牌，发牌
	void add(const Card& card);             //添加一张
	void add(const Cards& cards);           //添加多张
	void add(const QVector<Cards>& cards);  //添加

	// 一次性插入多个数据 (操作符重载 << )，单纯重载操作符，返回引用，可链式操作
	Cards& operator<<(const Card& card);
	Cards& operator<<(const Cards& cards);

	// 删除扑克牌，出牌
	void remove(const Card& card);    //删除一张
	void remove(const Cards& cards);  //删除多张
	void remove(const QVector<Cards>& cards);

	// 返回Cards对象里面的扑克牌的数量
	int cardCount();
	// 是否为空
	bool isEmpty();
	// 清空牌的集合
	void clear();

	// 最大点数
	Card::CardPoint maxPoint();
	// 最小点数
	Card::CardPoint minPoint();
	// 指定点数的牌的数量
	int pointCount(Card::CardPoint point);

	// 某张牌是否在集合中
	bool contains(const Card& card);
	// 判断某些牌是否在集合中
	bool contains(const Cards& cards);

	// 随机取出一张扑克牌，会把它删除
	Card takeRandomCard();

	// QVector<Card>
	// QSet -> QVector
	// 返回默认排序为降序的CardList集合，因为QSet不能自动排序，所以需要转为CardList
	CardList toCardList(SortType type = Desc);

	// 测试函数, 打印所有的卡牌信息
	void printAllCardInfo();

private:
	QSet<Card> m_cards;  // Qset不能自动排序，需要自己实现；STL 中的 set 可以自动排序
};

#endif  // CARDS_H
